#include "FuncionesAuxiliares.h"

void FuncionesAuxiliares::parseaFuncion(ifstream& archivoDefinicion, Funcion& funcion){

    // parsea el nombre del archivo con la funcion
    string archivoAssembler;
    getline(archivoDefinicion,archivoAssembler);
    funcion.setNombreArchivo(archivoAssembler);

    // parsea el nombre de la funcion
    string nombreFuncion;
    getline(archivoDefinicion,nombreFuncion);
    funcion.setNombre(nombreFuncion);

    // debug
    //cout << archivoAssembler << endl;
    //cout << nombreFuncion << endl;
    // end debug

    string linea;

    // parsea la cantidad de parametros
    getline(archivoDefinicion,linea);
    int cantidadParametros = atoi(linea.c_str());

    // debug
    //cout << cantidadParametros << endl;
    // end debug

    // parsea los parametros
    for (int i = 0; i < cantidadParametros; i++) {
        getline(archivoDefinicion,linea);
        Parametro parametro;
        parsearParametro(linea,parametro);

        // debug
        //cout << "Clase: " << parametro.getClaseDeDato() << endl;
        //cout << "EsValor: " << parametro.getEsValor() << endl;
        //cout << "EsInOut: " << parametro.getEsOut() << endl;
        // end debug

        funcion.agregarParametro(parametro);
    }

    // Parsear el parametro de salida
    getline(archivoDefinicion,linea);
    Parametro parametroSalida;
    parsearParametro(linea,parametroSalida);
    funcion.setParametroSalida(parametroSalida);

    // debug
    //cout << endl << endl << "SALIDA: " << endl;
    //cout << "Clase: " << parametroSalida.getClaseDeDato() << endl;
    //cout << "EsValor: " << parametroSalida.getEsValor() << endl;
    //cout << "EsInOut: " << parametroSalida.getEsOut() << endl;
    // end debug

}

ClaseDeDato parsearClaseDeDato(string clase){

	string c_bool_8		    = "C_BOOL_8";
	string c_bool_16	    = "C_BOOL_16";
	string c_bool_32	    = "C_BOOL_32";
	string c_bool_64	    = "C_BOOL_64";

	string c_integer_8	    = "C_INTEGER_8";
	string c_integer_16 	= "C_INTEGER_16";
	string c_integer_32 	= "C_INTEGER_32";
	string c_integer_64 	= "C_INTEGER_64";

	string c_u_integer_8 	= "C_U_INTEGER_8";
	string c_u_integer_16 	= "C_U_INTEGER_16";
	string c_u_integer_32 	= "C_U_INTEGER_32";
	string c_u_integer_64	= "C_U_INTEGER_64";

	string c_float      	= "C_FLOAT";

	string c_double     	= "C_DOUBLE";

	string c_list 	    	= "C_LISTA";
	string c_vector	    	= "C_VECTOR";
	string c_matriz	    	= "C_MATRIZ";

	string c_stringP	 	= "C_STRING_DE_PASCAL";
	string c_stringC	 	= "C_STRING_DE_C";

	string c_u_ngrande   	= "C_U_NGRANDE";
	string c_ngrande 	    = "C_NGRANDE";

	string c_void 	        = "C_VOID";


	ClaseDeDato resultado;

// BOOL

	if(c_bool_8.compare(clase) == 0){
		resultado= C_BOOL_8;
		return resultado;
	}

	if(c_bool_16.compare(clase) == 0){
		resultado= C_BOOL_16;
		return resultado;
	}

	if(c_bool_32.compare(clase) == 0){
		resultado= C_BOOL_32;
		return resultado;
	}

	if(c_bool_64.compare(clase)== 0){
		resultado= C_BOOL_64;
		return resultado;
	}

// INTEGER CON SIGNO

	if(c_integer_8.compare(clase) == 0){
		resultado= C_INTEGER_8;
		return resultado;
	}

	if(c_integer_16.compare(clase) == 0){
		resultado= C_INTEGER_16;
		return resultado;
	}

	if(c_integer_32.compare(clase) == 0){
		resultado= C_INTEGER_32;
		return resultado;
	}

	if(c_integer_64.compare(clase) == 0){
		resultado= C_INTEGER_64;
		return resultado;
	}


// INTEGER SIN SIGNO

	if(c_u_integer_8.compare(clase) == 0){
		resultado= C_U_INTEGER_8;
		return resultado;
	}

	if(c_u_integer_16.compare(clase) == 0){
		resultado= C_U_INTEGER_16;
		return resultado;
	}

	if(c_u_integer_32.compare(clase) == 0){
		resultado= C_U_INTEGER_32;
		return resultado;
	}

	if(c_u_integer_64.compare(clase) == 0){
		resultado= C_U_INTEGER_64;
		return resultado;
	}

// FLOAT

	if(c_float.compare(clase) == 0){
		resultado= C_FLOAT;
		return resultado;
	}


// DOUBLE

	if(c_double.compare(clase) == 0){
		resultado= C_DOUBLE;
		return resultado;
	}

// LIST

	if(c_list.compare(clase) == 0){
		resultado= C_LISTA;
		return resultado;
	}

// VECTOR

	if(c_vector.compare(clase) == 0){
		resultado= C_VECTOR;
		return resultado;
	}

// MATRIZ

	if(c_matriz.compare(clase) == 0){
		resultado= C_MATRIZ;
		return resultado;
	}

// STRING

	if(c_stringP.compare(clase) == 0){
		resultado= C_STRING_DE_PASCAL;
		return resultado;
	}

	if(c_stringC.compare(clase) == 0){
		resultado= C_STRING_DE_C;
		return resultado;
	}


// NUMERO GRANDE CON SIGNO

	if(c_ngrande.compare(clase) == 0){
		resultado= C_NGRANDE;
		return resultado;
	}

// NUMERO GRANDE SIN SIGNO

	if(c_u_ngrande.compare(clase) == 0){
		resultado= C_U_NGRANDE;
		return resultado;
	}

// VOID

    if(c_void.compare(clase) == 0){
		resultado= C_VOID;
		return resultado;
	}

	return resultado;
}

string FuncionesAuxiliares::parsearStringClase(ClaseDeDato claseDeDato){

	string c_bool_8	    	= "Bool8";
	string c_bool_16    	= "Bool16";
	string c_bool_32    	= "Bool32";
	string c_bool_64	    = "Bool64";

	string c_integer_8	    = "Int8";
	string c_integer_16	    = "Int16";
	string c_integer_32 	= "Int32";
	string c_integer_64 	= "Int64";

	string c_u_integer_8 	= "UInt8";
	string c_u_integer_16 	= "UInt16";
	string c_u_integer_32 	= "UInt32";
	string c_u_integer_64	= "UInt64";

	string c_float  	    = "Float";

	string c_double         = "Double";

	string c_list 	    	= "Lista";
	string c_vector	    	= "Vector";
	string c_matriz	    	= "Matriz";

	string c_stringDeC 	    = "StringDeC";
	string c_stringDePascal = "StringDePascal";

	string c_u_ngrande  	= "UNGrande";
	string c_ngrande 	    = "NGrande";

	string c_void           = "Void";


	string resultado = "";

// BOOL

	if(C_BOOL_8 == claseDeDato){
		resultado = c_bool_8;
		return resultado;
	}

	if(C_BOOL_16 == claseDeDato){
		resultado = c_bool_16;
		return resultado;
	}

	if(C_BOOL_32 == claseDeDato){
		resultado = c_bool_32;
		return resultado;
	}

	if(C_BOOL_64 == claseDeDato){
		resultado = c_bool_64;
		return resultado;
	}

// INTEGER CON SIGNO

	if(C_INTEGER_8 == claseDeDato){
		resultado = c_integer_8;
		return resultado;
	}

	if(C_INTEGER_16 == claseDeDato){
		resultado = c_integer_16;
		return resultado;
	}

	if(C_INTEGER_32 == claseDeDato){
		resultado = c_integer_32;
		return resultado;
	}

	if(C_INTEGER_64 == claseDeDato){
		resultado = c_integer_64;
		return resultado;
	}


// INTEGER SIN SIGNO

	if(C_U_INTEGER_8 == claseDeDato){
		resultado= c_u_integer_8;
		return resultado;
	}

	if(C_U_INTEGER_16 == claseDeDato){
		resultado= c_u_integer_16;
		return resultado;
	}

	if(C_U_INTEGER_32 == claseDeDato){
		resultado= c_u_integer_32;
		return resultado;
	}

	if(C_U_INTEGER_64 == claseDeDato){
		resultado= c_u_integer_64;
		return resultado;
	}

// FLOAT

	if(C_FLOAT == claseDeDato){
		resultado= c_float;
		return resultado;
	}


// DOUBLE

	if(C_DOUBLE == claseDeDato){
		resultado= c_double;
		return resultado;
	}

// LIST

	if(C_LISTA == claseDeDato){
		resultado= c_list;
		return resultado;
	}

// VECTOR

	if(C_VECTOR == claseDeDato){
		resultado= c_vector;
		return resultado;
	}

// MATRIZ

	if(C_MATRIZ == claseDeDato){
		resultado= c_matriz;
		return resultado;
	}

// STRING

	if(C_STRING_DE_C == claseDeDato){
		resultado= c_stringDeC;
		return resultado;
	}

	if(C_STRING_DE_PASCAL == claseDeDato){
		resultado= c_stringDePascal;
		return resultado;
	}

// NUMERO GRANDE CON SIGNO

	if(C_NGRANDE == claseDeDato){
		resultado= c_ngrande;
		return resultado;
	}

// NUMERO GRANDE SIN SIGNO

	if(C_U_NGRANDE == claseDeDato){
		resultado= c_u_ngrande;
		return resultado;
	}

// VOID

	if(C_U_NGRANDE == claseDeDato){
		resultado= c_void;
		return resultado;
	}

	return resultado;
}

void parsearParametro(string linea, Parametro& parametro){

	int posicionComa = linea.find_first_of(";");
	string nombreClase = linea.substr(0,posicionComa);

	ClaseDeDato clase = parsearClaseDeDato(nombreClase);
	parametro.setClaseDeDato(clase);

	linea = linea.substr(posicionComa + 1, linea.length());

	posicionComa = linea.find_first_of(";");

	string formaDePasaje = linea.substr(0, posicionComa);
	bool pasaje = (bool)atoi(formaDePasaje.c_str());
	parametro.setEsValor(pasaje);

	string tipoParametro = linea.substr(posicionComa + 1,linea.length());
	bool esInOut = (bool)atoi(tipoParametro.c_str());
	if ( esInOut ) {
	    parametro.setTipoParametro(OUT);
	}

}
